package com.example.dynamicschedule.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class JSONUtils {

	public static Object getKey4JsonStr(String jsonData, String key) {
		return stringToJsonObject(jsonData).get(key);
	}

	/**
	 * 将对象转换为jsonobject
	 * 
	 * @param key
	 * @param object
	 * @return
	 */
	public static JSONObject beanToJsonObject(Object object) {
		JSONObject jsonObject = JSONObject.parseObject(beanToJson(object));
		return jsonObject;
	}

	/**
	 * 将JSONObject转换为javaObject
	 * 
	 * @param key
	 * @param object
	 * @return
	 * @return
	 */
	public static <T> T jsonToObject(JSONObject jsonObject, Class<T> className) {
		return jsonObject.toJavaObject(className);
	}

	public static JSONObject stringToJsonObject(String jsonStr) {
		return JSONObject.parseObject(jsonStr);
	}

	public static JSONArray stringToJsonArray(String jsonStr) {
		return JSONObject.parseArray(jsonStr);
	}

	public static Object stringToJson(String jsonStr) {
		if (isJsonArray(jsonStr)) {
			return JSONObject.parseArray(jsonStr);
		} else if (isJsonObject(jsonStr)) {
			return JSONObject.parseObject(jsonStr);
		} else {
			return null;
		}
	}

	/**
	 * 将map转换为jsonobject
	 * 
	 * @param map
	 * @return
	 */
	public static JSONObject mapToJsonObject(Map<String, String> map) {
		JSONObject jsonObject = new JSONObject();
		for (Entry<String, String> entry : map.entrySet()) {
			jsonObject.put(entry.getKey(), entry.getValue());
		}
		return jsonObject;
	}

	/**
	 * bean对象转json字符串
	 * 
	 * @param obj
	 * @param dataFormatString
	 * @return
	 */
	public static String beanToJson(Object obj, String dataFormatString) {
		if (obj != null) {
			if (StringUtils.isEmpty(dataFormatString)) {
				return JSONObject.toJSONString(obj);
			}
			return JSONObject.toJSONStringWithDateFormat(obj, dataFormatString);
		}
		return null;
	}

	/**
	 * bean对象转json字符串
	 * 
	 * @param obj
	 * @return
	 */
	public static String beanToJson(Object obj) {
		if (obj != null) {
			return JSONObject.toJSONString(obj);
		}
		return null;
	}

	/**
	 * string字符串转成json字符串
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	public static String stringToJonByFastjson(String key, String value) {
		if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {
			return null;
		}
		Map<String, String> map = new HashMap<String, String>();
		map.put(key, value);
		return beanToJson(map);
	}

	/**
	 * json字符串转bean对象
	 * 
	 * @param json
	 * @param clazz
	 * @return
	 */
	public static <T> T stringToBean(String json, Class<T> clazz) {
		if (StringUtils.isEmpty(json) || clazz == null) {
			return null;
		}

		return JSONObject.parseObject(json, clazz);
	}

	/**
	 * json字符串转换成map对象
	 * 
	 * @param json
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, String> jsonToMap(String json) {
		if (StringUtils.isEmpty(json)) {
			return null;
		}
		return JSONObject.parseObject(json, Map.class);
	}

	/**
	 * 判断字符串是否可以转化为JSON数组
	 * 
	 * @param content
	 * @return
	 */
	public static boolean isJsonArray(String content) {
		if (StringUtils.isEmpty(content))
			return false;
		StringUtils.isEmpty(content);
		try {
			JSONArray.parseArray(content);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 判断字符串是否可以转化为json对象
	 * 
	 * @param content
	 * @return
	 */
	public static boolean isJsonObject(String content) {
		if (StringUtils.isEmpty(content))
			return false;
		try {
			JSONObject.parseObject(content);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * 获取json字符串中所有的key值
	 * 
	 * @param jsonString
	 * @return
	 */
	public static Set<String> getAllKeys(String jsonString) {
		Set<String> set = new HashSet<String>();
		// 按照","将json字符串分割成String数组
		String[] keyValue = jsonString.split(",");
		for (int i = 0; i < keyValue.length; i++) {
			String s = keyValue[i];
			// 找到":"所在的位置，然后截取
			int index = s.indexOf(":");
			if (index == -1) {
				return set;
			}
			// 第一个字符串因带有json的"{"，需要特殊处理
			if (i == 0) {
				set.add(s.substring(2, index - 1));
			} else {
				set.add(s.substring(1, index - 1));
			}
		}
		return set;
	}

}
